#include <bits/stdc++.h>
using namespace std;
int s[100005],ans,ans1,n,m,L,V;
vector<int>ss[100005];
bool vis[100005],ch[100005];
struct Node
{
    int d,v,a;
    double e,f;
};
Node a[100005];

void dfs(bool c[100005],int p)
{
    for(int i=1;i<=n;i++)
        ch[i]=false;
    int anss=ans;
    for(int i=1;i<=m;i++)
    {
        if(!c[i])
            continue;
        for(int j=0;j<ss[i].size();j++)
            if(!ch[ss[i][j]])
            {
                anss--;
                ch[ss[i][j]]=true;
            }
    }
    if(anss==0)
    {
        ans1=max(p,ans1);
        for(int i=1;i<=m;i++)
        {
            if(c[i])
            {
                c[i]=false;
                dfs(c,p+1);
                c[i]=true;
            }
        }
    }
}

int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int t;
    cin>>t;
    while(t--)
    {
        ans=0;
        cin>>n>>m>>L>>V;
        bool cc[100005]={};
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].d>>a[i].v>>a[i].a;
            if(a[i].a<0)
            {
                a[i].e=a[i].d*1.0;
                a[i].f=a[i].d*1.0+1.0*(V*V-a[i].v*a[i].v)/(2*a[i].a*1.0);
            }
            else
            {
                a[i].e=a[i].d*1.0+1.0*(V*V-a[i].v*a[i].v)/(2*a[i].a*1.0);
                a[i].f=L*1.0;
            }
            vis[i]=false;
        }
        for(int i=1;i<=m;i++)
        {
            cin>>s[i];
            cc[i]=true;
            for(int j=1;j<=n;j++)
            {
                if(a[j].e<=s[i]&&a[j].f>=s[i])
                {
                    vis[j]=true;
                    ss[i].push_back(j);
                }
            }
        }
        for(int i=1;i<=n;i++)
            if(vis[i])
                ans++;
        ans1=0;
        dfs(cc,0);
        cout<<ans<<" "<<ans1-1<<endl;
    }
    return 0;
}
